/*********************************************************************************************
	Fichier: Terrain.h
	On définie les fonctions utilisées dans Terrain.c
**********************************************************************************************/


#ifndef TERRAIN_H
#define TERRAIN_H
#include "Constantes.h"
#include "Formes.h"

/*
	struct Terrain
	on définie un terrain de dimension DimX*DimY comme un tableau de pièces.
*/
struct Terrain
{
	int dimX;
	int dimY;
	Piece * ter[100][100];
};

typedef struct Terrain Terrain;

/*
	 On alloue de la place en mémoire pour le terrain.
*/
Terrain * TerrainCreer(void);

/*
	On libère l'espace mémoire alloué pour le terrain, ainsi le terrain est détruit.
*/
void TerrainDetruire(Terrain * t);

/*
	On initialise le terrain avec une hauteur de TAILLE_Y blocs et une largeur de TAILLE_X blocs où l'on met 0. Avec TAILLE_X et TAILLE_Y définit dans Constantes.h .
*/
void TerrainInitialiser(Terrain* t);

/*
	Verifie que la position d'une pièce dans le terrain est correcte en (x,y).
	paramètre x coordonnée horizontale d'une pièce.
	paramètre y coordonnée verticale d'une pièce.
	retourne 1 si la position est correcte, 0 sinon.
*/
int TerrainPositionEstCorrecte(int x, int y);

/*
	Permet l'accès à l'adresse d'une pièce.
	le terrain t doit être initialisé.
	paramètre x coordonnée horizontale de la pièce.
	paramètre y coordonnée verticale d'une pièce.
	retourne l'adresse d'une pièce.
*/
Piece * TerrainGetPieceXY(Terrain* t, int x, int y);

/*
	Permet l'accès à la largeur du terrain.
	le terrain t doit être initialisé.
	retourne la dimension de la largeur du terrain.
*/
int TerrainGetDimX(Terrain* t);

/*
	Permet l'accès à la hauteur du terrain.
	le terrain t doit être initialisé.
	retourn la dimension de la hauteur du terrain.
*/
int TerrainGetDimY(Terrain* t);

/*
	 Supprime une ligne du terrain.
	le terrain t doit être initialisé.
	paramètre l ligne à supprimer.
*/
void TerrainSupprimerLigne (Terrain* t, int l);

/*
	Cherche les lignes pleines.
	le terrain t doit être initialisé.
	return le nombre de lignes pleines.
*/
int TerrainChercherLignePleine(Terrain* t, int *tab);

/*
	 Ajoute une pièce en haut au milieu du terrain.
	le terrain t doit être initialisé.
	la pièce p doit être initialisée.
	retourne 1 si la pièce est ajoutée, 0 sinon.
*/
int TerrainAjouterPiece(Terrain* t, Piece* p);

/*
	Déplace une pièce sur le terrain.
	le terrain t doit être initialisé.
	 la pièce p doit être initialisée.
	param p pièce à déplacer.
	param d direction dans laquelle déplacer la pièce définit dans Constantes.h .
	retourne 1 si le déplacement a eu lieu et 0 si cela n'a pas pu se faire.
*/
int TerrainDeplacerPiece(Piece* p, Terrain* t, Direction d);

/*
	Test si il y a une collision sur le terrain.
	le terrain t doit être initialisé.
	 la pièce p doit être initialisée.
	param p pièce à utiliser pour le test.
	param d direction dans laquelle il faut tester la collision la pièce définit dans Constantes.h .
	retourne 1 si il n'y a pas de collision, 0 sinon.
*/
int TerrainTestCollision(Piece* p, Terrain* t, Direction d);

/*
	Efface le terrain.
	 le terrain t doit être initialisé.
*/
void TerrainEffacer(Terrain* t);

/*
	 Affiche le terrain.
	 le terrain t doit être initialisé.
*/
void TerrainAfficher(Terrain* t);

/*
	 Test si la rotation est possible.
	 le terrain t doit être initialisé.
	retourne 1 si la rotation est possible, 0 sinon.
*/
int TerrainTestRotation(Piece * p, Terrain * t);

/*
	f Fait la rotation si elle est possible.
	 le terrain t doit être initialisé.
	retourne 1 si la pièce a tournée, 0 sinon.
*/
int TerrainRotation(Piece * p, Terrain * t);

/*
	 Fait tomber la pièce au plus bas possible dans le terrain.
	 le terrain t doit être initialisé.
	retourn 1 si le déplacement est fait 0 sinon.
*/
int TerrainAppliquerPesanteur(Terrain * t);

#endif
